package org.example.spring.ioc;

import org.example.spring.ioc.bean.Person;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.context.ConfigurableApplicationContext;

import java.util.Map;

@SpringBootApplication
public class Spring01IocApplication {

    public static void main(String[] args) {
        //1.跑起一个spring的应用； ApplicationContext:Spring应用上下文对象：Ioc容器
        ConfigurableApplicationContext ioc = SpringApplication.run(Spring01IocApplication.class, args);
        System.out.println("ioc = "+ ioc);
        System.out.println("-----------------------------------------------");
        //2.获取到容器中所有组件的名字，容器中装了那些组件； Spring启动会有很多默认组件
//        String[] names = ioc.getBeanDefinitionNames();
//        for(String name : names){
//            System.out.println( "name = "+name);
//        }
        //4.获取容器中的组件对象，精确获取某个组件
        //组件的四大特性：名字、类型、对象、作用域
        //组件名称全局唯一，如果名字重复，一定只会给容器中放一个最先声明的组件对象

        //小结：
        //1.从容器中获取组件，
        // 1)组件不存在，会抛出异常：NoSuchBeanDefinitionException
        // 2)组件不唯一，
        //   1.按照类型只要一个对象，会抛出异常：NoUniqueBeanDefinitionException
        //   2.按照组件名称，会返回一个对象
        //   3.组件有多个，会返回一个数组
        // 3）组件唯一，会正确返回这个组件

        //4.1按照名字获取组件
        Person person = (Person) ioc.getBean("zhangsan");
        System.out.println("对象:"+person);

        //4.2按照类型获取组件
//        Person person1 = ioc.getBean(Person.class);
//        System.out.println("对象:"+person1);

        //4.3按照组件类型获取这种类型的所有对象
        Map<String, Person> beansOfType = ioc.getBeansOfType(Person.class);
        System.out.println("对象:"+beansOfType);

        //4.4按照类型加名字获取组件
        Person person1 = ioc.getBean("lisi", Person.class);
        System.out.println("对象:"+person1);
    }


}
